/* PR c/102989 */
/* { dg-do run { target bitint } } */
/* { dg-options "-std=c23 -pedantic-errors" } */
/* { dg-skip-if "" { ! run_expensive_tests }  { "*" } { "-O0" "-O2" } } */
/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */

#if __BITINT_MAXWIDTH__ >= 192
__attribute__((noipa)) void
test135_171_192 (_BitInt(135) *p, _BitInt(171) *q, _BitInt(192) *r,
		 unsigned _BitInt(135) *s, unsigned _BitInt(171) *t,
		 unsigned _BitInt(192) *u, int n)
{
  p[5] = q[0];
  q[5] = p[0] + p[1];
  p[6] = r[0];
  r[5] = p[1];
  q[6] = r[1] + r[0];
  r[6] = q[1];
  p[7] = (unsigned _BitInt(135)) t[0] + (_BitInt(135)) t[1];
  q[7] = s[0];
  p[8] = u[0];
  r[7] = s[1];
  q[8] = u[1];
  r[8] = t[1];
  s[5] = q[2] - q[3];
  t[5] = p[2];
  s[6] = r[2];
  u[5] = p[3];
  t[6] = r[3];
  u[6] = q[3];
  s[7] = t[2];
  t[7] = s[2];
  s[8] = u[2];
  u[7] = s[3];
  t[8] = u[3];
  u[8] = t[3];
  u[9] = ((_BitInt(171)) (p[2] + p[3]) + q[2]) + u[2];
  p[9] = q[4] < p[4];
  q[9] = t[4] >= u[4];
  s[9] = ((_BitInt(171)) p[4]) << n;
  t[9] = ((_BitInt(171)) s[4]) >> n;
}
#endif

#if __BITINT_MAXWIDTH__ >= 575
__attribute__((noipa)) void
test522_547_575 (_BitInt(522) *p, _BitInt(547) *q, _BitInt(575) *r,
		 unsigned _BitInt(522) *s, unsigned _BitInt(547) *t,
		 unsigned _BitInt(575) *u, int n)
{
  p[5] = q[0];
  q[5] = p[0] + p[1];
  p[6] = r[0];
  r[5] = p[1];
  q[6] = r[1] + r[0];
  r[6] = q[1];
  p[7] = (unsigned _BitInt(522)) t[0] + (_BitInt(522)) t[1];
  q[7] = s[0];
  p[8] = u[0];
  r[7] = s[1];
  q[8] = u[1];
  r[8] = t[1];
  s[5] = q[2] - q[3];
  t[5] = p[2];
  s[6] = r[2];
  u[5] = p[3];
  t[6] = r[3];
  u[6] = q[3];
  s[7] = t[2];
  t[7] = s[2];
  s[8] = u[2];
  u[7] = s[3];
  t[8] = u[3];
  u[8] = t[3];
  u[9] = ((_BitInt(547)) (p[2] + p[3]) + q[2]) + u[2];
  p[9] = q[4] < p[4];
  q[9] = t[4] >= u[4];
  s[9] = ((_BitInt(547)) p[4]) << n;
  t[9] = ((_BitInt(547)) s[4]) >> n;
}
#endif

int
main ()
{
#if __BITINT_MAXWIDTH__ >= 192
  static _BitInt(135) p135[15] = {
    -21017626881393060962682831099345275646127wb,
    3694296893212130938499913614460066245857wb,
    -346978153630491292366720842786572608600wb,
    -12051883812785324688960115817645360041052wb,
    894554736479161756765856528934783wb,
    0, 0, 0, 0, 0,
    -10126751695395432170173641758862456728384wb,
    5972941260331487493885375988782293547456wb,
    1994359513041991206938472369666304432410wb,
    -6563811307898601259032789037472160962572wb,
    0wb
  };
  static _BitInt(171) q171[15] = {
    -625366993761622480400669212262678861717858330946368wb,
    824211109381944261174032176940659654188131012437179wb,
    546292738086463798921197562372110173424343217923278wb,
    511148834019524346739032507408677732131367119592267wb,
    347611384453999342493570524785293850801864814800614wb,
    0, 0, 0, 0, 0,
    -17323329988180930024182917484885209400270wb,
    -1427703038865092853121951937517407564490420667866520wb,
    38147269358417182782171905780014948953272wb,
    467958077036848086326034408503276340843337835865495wb,
    0wb
  };
  static _BitInt(192) r192[15] = {
    1392184189278706283348529493736576751111606618688367065536wb,
    1141852629791713898948497335488732622599274881068663548072wb,
    -2714462128387415582772926191122594432964111301268533078042wb,
    2425769388758313376333650042373508250767256770936531653671wb,
    2720431110756499648348639705956093809255126267584967484234wb,
    0, 0, 0, 0, 0,
    3694296893212130938499913614460066245857wb,
    824211109381944261174032176940659654188131012437179wb,
    24158489198104933635096197097903724015499wb,
    606766803137851050688065717544996275384988908585315wb,
    0wb
  };
  static unsigned _BitInt(135) s135[15] = {
    38147269358417182782171905780014948953272uwb,
    24158489198104933635096197097903724015499uwb,
    15056704170354189252536066857287800623071uwb,
    25206995790075003034339862074263410882988uwb,
    19207954769547491779143235037830592504231uwb,
    0, 0, 0, 0, 0,
    31754930256886813275958100253331871451523uwb,
    15245728220153286789447947809930478163942uwb,
    9156112246512545688879043617340759142722uwb,
    40264644850602433398431024975343109499285uwb,
    41168227647461841063600478959378800574464uwb
  };
  static unsigned _BitInt(171) t171[15] = {
    485349495244621624686447991535899196145754495768503uwb,
    606766803137851050688065717544996275384988908585315uwb,
    333199438528630292656855934377866394553406065406274uwb,
    2139385105954223838532102833374805075850015235549769uwb,
    1678008128571185237771726930519720682651619103697237uwb,
    0, 0, 0, 0, 0,
    2993155353253342198327516046110580903412563275406248uwb,
    2550578100027524622604893738184060999550811074270247uwb,
    15056704170354189252536066857287800623071uwb,
    699234106698292061166730462199993896682394735156989uwb,
    4367383273699372643737486905uwb
  };
  static unsigned _BitInt(192) u192[15] = {
    4671639464410605725298192070070307015392908693211956881396uwb,
    715636974522854835742140132808616653707176693849553888663uwb,
    457579096729186368426895847730802215502050535098936945045uwb,
    1103175995161405903311011421434916994075193954478175624957uwb,
    5439093776557462873830329048469734037495210381156250832820uwb,
    0, 0, 0, 0, 0,
    6277101735386680751783905610422341727142239626818674471844uwb,
    511148834019524346739032507408677732131367119592267uwb,
    25206995790075003034339862074263410882988uwb,
    2139385105954223838532102833374805075850015235549769uwb,
    457579643021924442491832802512548606285387299010222218671uwb
  };
  test135_171_192 (p135, q171, r192, s135, t171, u192, 42);
  for (int i = 5; i < 10; ++i)
    if (p135[i] != p135[i + 5]
	|| q171[i] != q171[i + 5]
	|| r192[i] != r192[i + 5]
	|| s135[i] != s135[i + 5]
	|| t171[i] != t171[i + 5]
	|| u192[i] != u192[i + 5])
      __builtin_abort ();
#endif
#if __BITINT_MAXWIDTH__ >= 575
  static _BitInt(522) p522[15] = {
    1688583697238081957015024340932764748327491668109158685467058555721380506305071231550264349039164029945469865795968233973631543964236809100573066960995245177wb,
    150663282285775450662414365350419405945541820765219523130929531002923088277160545114254251148525286476983773283235468282002045173141196158353616014355287094wb,
    -479060863800931266429781304885104017131749664329186246406335179483194313801808166262041921602861985862332756318078499039394820190197870580545316549380449074wb,
    1359131269843466711194682581441372588504604777186075559309941421522168913086212721229905012023237380094986736934464910421922092415050027946837562847761546642wb,
    38005189198839309539384162035472227153066377585338581102543574055575777451369497515143095968263424053357137645031423561696064649082930963wb,
    0, 0, 0, 0, 0,
    1911076617401423887269840833410267237705130466676958152037861477885277722749139605040038160132075189228439111066941630564324402605816835862488337890450123441wb,
    2143747820933189266943449152733920616973804237879618575235243631855378946947754007625444647681930476713800905339559157073740302180956472245149919774437085550wb,
    3020328738802050781697314194154464021447637901030508296205170033161531452424686777206896481266404991349073132253866303142608091273541629412071886412132279688wb,
    3548552946267883916132218767540000478942702862442658213517298532968411704728913569849574500607350293984423898514369017381981825383513090204371793724097677500wb,
    0wb
  };
  static _BitInt(547) q547[15] = {
    -165353820935998006231385303476800492106677276950834360813262262140867129737290132086107434762098834639119492256272880571578714556242252134191835397505691625332102479wb,
    183695555784071631934553514377048200879108759149452364923958570648444896373196632060114376244737698247102365620343713172199496472928539579603161884440477984840044187wb,
    139975743565335456314316356647588328869546947948448304225648231332737456493208842047425843515598984558359834966436458515450535075922755618635258426884425597017306862wb,
    -68977268331926408936317559581002324220146009615687701127254186456806021645364222184642001923334926042747842307638529875034306779796443629804024646337944171607895438wb,
    91932189605038085807227077574075596679601857184786010334359253878486168031464536332131456527844457578512045265477412819469725001337530261064906167819503147594853366wb,
    0, 0, 0, 0, 0,
    1839246979523857407677438706283184154273033488874378208597988086724303594582231776664518600187689316422453639079203702255633589137378005258926682975350532271wb,
    49151230401218799957130323446282917069028231656715550463945235235623430774823230155689924560414670278246826717504404635655151576036315823360722825188858286217308439wb,
    9553161692302515408090681902990032962274757557255101236499698228392460650767938620693069133770230123184487473131034348424915457011452743114281594442529356918wb,
    148466349169509850971880825885649862512888667929683428885486286008574376924695036417770580112507292038258577594242665019379719515779240480203475588034326681778827837wb,
    0wb
  };
  static _BitInt(575) r575[15] = {
    26826731245669206245461391126964073367685598786847623620556904941634299886033194729072082303506281733460775551098898854360334228479162479457887049265892154734615530822766958wb,
    -17252637235610200065109317402231975926530699783926188946291304643884915080832768297094963378392971235218154081350840664198841060114648240981027529664968282740385246545569879wb,
    -52927846040946009564438022882734367309063070035915874157090678963969555482365010516321242268874731309847996546526357803037049653154886399755465425844249799943139498370138356wb,
    43797192926762436278400269352553576566711887692587698009480808423919842536790683665562833898774167035902777714908510813261288364232387952547718429572231820909634939092793538wb,
    20234448725793738746286884524404371396011280587539411448314107254021820060093226611203035940379115510914907477160212849326875709895927134019157662749025851187493640146044781wb,
    0, 0, 0, 0, 0,
    150663282285775450662414365350419405945541820765219523130929531002923088277160545114254251148525286476983773283235468282002045173141196158353616014355287094wb,
    183695555784071631934553514377048200879108759149452364923958570648444896373196632060114376244737698247102365620343713172199496472928539579603161884440477984840044187wb,
    4851258619379431619519122339214063398230494067942295987016754503060997355109186638667322723996572842157209194651881355085513631695628096402419719096882984119wb,
    270940858229872855030935066513853051367534588484589172383739756326100509416298021769516239928911004114519037087137992976731526127660469862578530915810061315551592797wb,
    0wb
  };
  static unsigned _BitInt(522) s522[15] = {
    9553161692302515408090681902990032962274757557255101236499698228392460650767938620693069133770230123184487473131034348424915457011452743114281594442529356918uwb,
    4851258619379431619519122339214063398230494067942295987016754503060997355109186638667322723996572842157209194651881355085513631695628096402419719096882984119uwb,
    6042770678215430693640419990277820504092375118859355031950453294245655804901016852383090438332300632578629742514358616423826815593825261808316937209844323511uwb,
    12051208019451501933403724997574202861308205865422702777923943166771946439789370797531339169859679650622650974816793351928749417853531441599839154382248843947uwb,
    4221662083598509731422820533439331938122897651286500598721158769592271101088973546986107452648130743363570867708770978567950497328105753210259754199339698436uwb,
    0, 0, 0, 0, 0,
    7875787883122370015751284313157111317906983827437747001268058546750891954500439966161560575930887369730973089278944338386239832138713121400371960426603537532uwb,
    1744137654875073805109882450938570695232931878270397801451971688045434401366666192926859108662009962657770297731676696275736871955838688525022864084574797580uwb,
    1384759081458967898144776881134701550216992364037761109180860974761009009582780990796335747812536429464522433496147744197656107248393986692577240524935263967uwb,
    5124843933530741349702512002787631405197501632531242713014934699385673582868823319052853705098680028945536856890553829308345383420583019490169170519445809329uwb,
    167148589759802650246016819120863239719632156514525854640607511535259699817887971573240690630534000867480233158226351195963838422746014594980644913152uwb
  };
  static unsigned _BitInt(547) t547[15] = {
    118704181285368794475444886856018739380810770111464325340905883331118179085356913273672350794295633026214255802587734669771992302197074150034392332589894477800891435uwb,
    270940858229872855030935066513853051367534588484589172383739756326100509416298021769516239928911004114519037087137992976731526127660469862578530915810061315551592797uwb,
    148318595435099152643319192673870560615622574014851374282185242873863044665507345404380126683143560616100080924441878075099797842853873146415865873849906128482858719uwb,
    400009336874533540769201404797235801738671871521831649835366524748844548359672560304665337919920648881530376390480880285772783211641574132727624581374918623770667162uwb,
    312402853341542293879363014443999872603984243465217297921316340174779530859340793778010030453656373118302384722907441723040044092150534190429029290814183834885671793uwb,
    0, 0, 0, 0, 0,
    460688772082162445798867876757263237463152967782366598900331124229116988777566044118861599994996502169289915386539783342538027404687796097956601373975276229385346254uwb,
    110154623692678850196652173379922527637463658741605878515537649114990721104784513051339522805651918716345423521491055109328010793688754512750702811781309047768676546uwb,
    6042770678215430693640419990277820504092375118859355031950453294245655804901016852383090438332300632578629742514358616423826815593825261808316937209844323511uwb,
    399932168246430744543441055162559648552560119213629719844739099564504242321283467689573394637126627461985951275205392441444721842415628268892060247464270805433239423uwb,
    959894824427126361893629230835206712554940543506404673899205310952372906533349475236288402049497277258426690357003048704416527773015730692863997uwb
  };
  static unsigned _BitInt(575) u575[15] = {
    99465403292080375994166564143758974423715332054535509951564765439354460753284837794651681099567775806058182781885452212314717097157170419602135858778485292072068230160566460uwb,
    88608049883790202897201248133818379667781926476953929504091250051759382873398323059272759974739854128718622623196375150866798266503497028016169226040920220555730755500552765uwb,
    109996629797150279215121425420517668082012320009431263010584742106213909329388552729870453505045429145144806346761163201752908500506299217142569716987778685190706093716744369uwb,
    79085012468256116329498575277619682348270018511342269619476165669326091481750859826134218624634485255862979362030324907252864643018828592244764325998135532395602379128096639uwb,
    66159275290347502690275324386397674256469688848451250551469155682688473691401346605236603803735518810344975633814051516285290687587632060625865757225821322257077271128705141uwb,
    0, 0, 0, 0, 0,
    1359131269843466711194682581441372588504604777186075559309941421522168913086212721229905012023237380094986736934464910421922092415050027946837562847761546642uwb,
    123665200667574998698324851573506035436563350330459910341343826919194426096459911939793978345979520571463909670260227362037152642119068825187329447746921937620359214466454130uwb,
    12051208019451501933403724997574202861308205865422702777923943166771946439789370797531339169859679650622650974816793351928749417853531441599839154382248843947uwb,
    400009336874533540769201404797235801738671871521831649835366524748844548359672560304665337919920648881530376390480880285772783211641574132727624581374918623770667162uwb,
    109996629937126023660527287777369469494501925435246782331888159188751453565732251262053894836875827628606881325496392400843347632343245675592597560475194478367377989115148799uwb
  };
  test522_547_575 (p522, q547, r575, s522, t547, u575, 42);
  for (int i = 5; i < 10; ++i)
    if (p522[i] != p522[i + 5]
	|| q547[i] != q547[i + 5]
	|| r575[i] != r575[i + 5]
	|| s522[i] != s522[i + 5]
	|| t547[i] != t547[i + 5]
	|| u575[i] != u575[i + 5])
      __builtin_abort ();
#endif
}
